#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <sw/redis++/redis++.h>

using namespace std;


void test1(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.sadd("key", "111");
    redis.sadd("key", {"222", "333"});
    set<string> se = {"444", "555"};
    redis.sadd("key", se.begin(), se.end());

    set<string> res;
    auto it = inserter(res, res.end());
    redis.smembers("key", it);

    for(auto& e : res)
    {
        cout << e << endl;
    }
}

void test2(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.sadd("key", {"111", "222", "333"});
    bool res = redis.sismember("key", "111");
    cout << res << endl;
}

void test3(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.sadd("key", {"111", "222", "333"});
    auto res = redis.scard("key");
    cout << res << endl;
}

void test4(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.sadd("key", {"111", "222", "333"});
    auto res = redis.spop("key");
    cout << res.value() << endl;
}

void test5(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.sadd("key1", {"111", "222", "333"});
    redis.sadd("key2", {"111", "222", "444"});
    
    set<string> res;
    auto it = inserter(res, res.end());
    redis.sinter({"key1", "key2"}, it);

    for(auto& e : res)
    {
        cout << e << endl;
    }
}

void test6(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.sadd("key1", {"111", "222", "333"});
    redis.sadd("key2", {"111", "222", "444"});
    
    auto len = redis.sinterstore("key3", {"key1", "key2"});
    cout << len << endl;

    set<string> res;
    auto it = inserter(res, res.end());
    redis.smembers("key3", it);

    for(auto& e : res)
    {
        cout << e << endl;
    }
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);
    test6(redis);

    return 0;
}